Test coverage report for pyFAI ============================== Measured on *pyFAI* version 2025.12.0, 12/12/2025 .. csv-table:: Test suite coverage :header: "Name", "Stmts", "Exec", "Cover" :widths: 35, 8, 8, 8 "__init__.py", "40", "29", "72.5 %" "average.py", "515", "360", "69.9 %" "azimuthalIntegrator.py", "10", "10", "100.0 %" "blob_detection.py", "502", "191", "38.0 %" "calibrant.py", "21", "21", "100.0 %" "containers.py", "859", "765", "89.1 %" "control_points.py", "372", "145", "39.0 %" "diffmap.py", "584", "284", "48.6 %" "directories.py", "20", "15", "75.0 %" "distortion.py", "608", "386", "63.5 %" "geometryRefinement.py", "593", "336", "56.7 %" "goniometer.py", "586", "360", "61.4 %" "grid.py", "38", "15", "39.5 %" "load_integrators.py", "10", "10", "100.0 %" "massif.py", "240", "195", "81.2 %" "method_registry.py", "355", "298", "83.9 %" "multi_geometry.py", "387", "165", "42.6 %" "parallax.py", "284", "226", "79.6 %" "ring_extraction.py", "119", "111", "93.3 %" "spline.py", "426", "251", "58.9 %" "units.py", "460", "365", "79.3 %" "version.py", "62", "45", "72.6 %" "worker.py", "736", "372", "50.5 %" "app/__init__.py", "6", "6", "100.0 %" "app/average.py", "177", "34", "19.2 %" "app/benchmark.py", "62", "17", "27.4 %" "app/calib2.py", "376", "34", "9.0 %" "app/calib.py", "24", "15", "62.5 %" "app/check_calib.py", "31", "20", "64.5 %" "app/detector2nexus.py", "94", "20", "21.3 %" "app/diff_map.py", "38", "16", "42.1 %" "app/diff_tomo.py", "107", "23", "21.5 %" "app/drawmask.py", "107", "33", "30.8 %" "app/eiger_mask.py", "57", "22", "38.6 %" "app/integrate.py", "551", "399", "72.4 %" "app/mx_calibrate.py", "25", "15", "60.0 %" "app/peakfinder.py", "289", "54", "18.7 %" "app/pilx.py", "69", "16", "23.2 %" "app/recalib.py", "26", "15", "57.7 %" "app/saxs.py", "86", "24", "27.9 %" "app/sparsify.py", "284", "55", "19.4 %" "app/waxs.py", "98", "25", "25.5 %" "benchmark/__init__.py", "634", "87", "13.7 %" "crystallography/__init__.py", "11", "11", "100.0 %" "crystallography/calibrant.py", "365", "280", "76.7 %" "crystallography/calibrant_factory.py", "48", "39", "81.2 %" "crystallography/cell.py", "170", "158", "92.9 %" "crystallography/resolution.py", "63", "62", "98.4 %" "crystallography/space_groups.py", "2338", "2226", "95.2 %" "detectors/__init__.py", "23", "23", "100.0 %" "detectors/_adsc.py", "64", "64", "100.0 %" "detectors/_common.py", "979", "734", "75.0 %" "detectors/_dectris.py", "388", "297", "76.5 %" "detectors/_esrf.py", "71", "67", "94.4 %" "detectors/_hexagonal.py", "73", "69", "94.5 %" "detectors/_imxpad.py", "355", "232", "65.4 %" "detectors/_non_flat.py", "144", "122", "84.7 %" "detectors/_others.py", "86", "82", "95.3 %" "detectors/_psi.py", "192", "109", "56.8 %" "detectors/_rayonix.py", "240", "216", "90.0 %" "detectors/_xspectrum.py", "60", "54", "90.0 %" "detectors/orientation.py", "35", "35", "100.0 %" "detectors/sensors.py", "116", "109", "94.0 %" "engines/CSC_engine.py", "214", "139", "65.0 %" "engines/CSR_engine.py", "251", "242", "96.4 %" "engines/__init__.py", "18", "18", "100.0 %" "engines/histogram_engine.py", "92", "84", "91.3 %" "engines/preproc.py", "121", "92", "76.0 %" "ext/__init__.py", "2", "2", "100.0 %" "geometry/__init__.py", "8", "8", "100.0 %" "geometry/core.py", "1406", "1130", "80.4 %" "geometry/crystfel.py", "161", "147", "91.3 %" "geometry/cxi.py", "0", "0", "0.0 %" "geometry/fit2d.py", "136", "121", "89.0 %" "geometry/imaged11.py", "115", "100", "87.0 %" "gui/ApplicationContext.py", "108", "51", "47.2 %" "gui/CalibrationContext.py", "227", "128", "56.4 %" "gui/CalibrationWindow.py", "192", "169", "88.0 %" "gui/IntegrationDialog.py", "203", "53", "26.1 %" "gui/__init__.py", "3", "3", "100.0 %" "gui/cli_calibration.py", "1565", "108", "6.9 %" "gui/diffmap_widget.py", "479", "79", "16.5 %" "gui/matplotlib.py", "32", "26", "81.2 %" "gui/mpl_calib.py", "241", "40", "16.6 %" "gui/mpl_calib_qt.py", "47", "19", "40.4 %" "gui/peak_picker.py", "300", "108", "36.0 %" "gui/dialog/Detector3dDialog.py", "173", "36", "20.8 %" "gui/dialog/DetectorSelectorDialog.py", "532", "400", "75.2 %" "gui/dialog/GeometryDialog.py", "57", "16", "28.1 %" "gui/dialog/IntegrationMethodDialog.py", "216", "36", "16.7 %" "gui/dialog/MessageBox.py", "27", "8", "29.6 %" "gui/dialog/OpenClDeviceDialog.py", "116", "14", "12.1 %" "gui/dialog/__init__.py", "3", "3", "100.0 %" "gui/helper/MarkerManager.py", "209", "65", "31.1 %" "gui/helper/ProcessingWidget.py", "19", "6", "31.6 %" "gui/helper/RingCalibration.py", "320", "53", "16.6 %" "gui/helper/RingExtractor.py", "249", "36", "14.5 %" "gui/helper/SynchronizeMaskToolColor.py", "26", "26", "100.0 %" "gui/helper/SynchronizePlotBackground.py", "26", "25", "96.2 %" "gui/helper/SynchronizeRawView.py", "60", "47", "78.3 %" "gui/helper/__init__.py", "3", "3", "100.0 %" "gui/helper/model_transform.py", "112", "15", "13.4 %" "gui/jupyter/__init__.py", "2", "2", "100.0 %" "gui/jupyter/_plot.py", "102", "16", "15.7 %" "gui/jupyter/calib.py", "93", "21", "22.6 %" "gui/model/AbstractModel.py", "36", "30", "83.3 %" "gui/model/CalibrantModel.py", "19", "17", "89.5 %" "gui/model/CalibrationModel.py", "44", "42", "95.5 %" "gui/model/ConstraintModel.py", "60", "21", "35.0 %" "gui/model/DataModel.py", "15", "14", "93.3 %" "gui/model/DataModelAdaptor.py", "27", "12", "44.4 %" "gui/model/DetectorModel.py", "15", "14", "93.3 %" "gui/model/ExperimentSettingsModel.py", "113", "101", "89.4 %" "gui/model/FilenameModel.py", "21", "14", "66.7 %" "gui/model/Fit2dGeometryModel.py", "64", "32", "50.0 %" "gui/model/GeometryConstraintsModel.py", "86", "41", "47.7 %" "gui/model/GeometryHistoryModel.py", "40", "14", "35.0 %" "gui/model/GeometryModel.py", "89", "41", "46.1 %" "gui/model/ImageModel.py", "80", "43", "53.8 %" "gui/model/IntegrationSettingsModel.py", "26", "23", "88.5 %" "gui/model/ListModel.py", "130", "92", "70.8 %" "gui/model/MarkerModel.py", "48", "34", "70.8 %" "gui/model/MaskedImageModel.py", "31", "17", "54.8 %" "gui/model/PeakModel.py", "87", "54", "62.1 %" "gui/model/PeakSelectionModel.py", "85", "34", "40.0 %" "gui/model/PlotViewModel.py", "64", "62", "96.9 %" "gui/model/PreProcessedImageModel.py", "55", "46", "83.6 %" "gui/model/__init__.py", "3", "3", "100.0 %" "gui/pilx/HorizontalRangeROI.py", "14", "10", "71.4 %" "gui/pilx/MainWindow.py", "306", "50", "16.3 %" "gui/pilx/__init__.py", "0", "0", "0.0 %" "gui/pilx/models.py", "9", "9", "100.0 %" "gui/pilx/point.py", "23", "7", "30.4 %" "gui/pilx/utils.py", "119", "31", "26.1 %" "gui/pilx/widgets/ClearPointsAction.py", "16", "12", "75.0 %" "gui/pilx/widgets/DiffractionImagePlotWidget.py", "44", "19", "43.2 %" "gui/pilx/widgets/ImagePlotWidget.py", "68", "28", "41.2 %" "gui/pilx/widgets/IntegratedPatternPlotWidget.py", "97", "29", "29.9 %" "gui/pilx/widgets/MapPlotContextMenu.py", "49", "21", "42.9 %" "gui/pilx/widgets/MapPlotWidget.py", "152", "38", "25.0 %" "gui/pilx/widgets/OpenAxisDatasetAction.py", "29", "15", "51.7 %" "gui/pilx/widgets/RoiModeAction.py", "24", "14", "58.3 %" "gui/pilx/widgets/RoiRangeWidget.py", "50", "18", "36.0 %" "gui/pilx/widgets/TitleWidget.py", "12", "9", "75.0 %" "gui/pilx/widgets/__init__.py", "0", "0", "0.0 %" "gui/tasks/AbstractCalibrationTask.py", "79", "72", "91.1 %" "gui/tasks/ExperimentTask.py", "365", "267", "73.2 %" "gui/tasks/GeometryTask.py", "817", "376", "46.0 %" "gui/tasks/IntegrationTask.py", "836", "304", "36.4 %" "gui/tasks/MaskTask.py", "221", "148", "67.0 %" "gui/tasks/PeakPickingTask.py", "1364", "588", "43.1 %" "gui/tasks/__init__.py", "3", "3", "100.0 %" "gui/test/__init__.py", "48", "33", "68.8 %" "gui/utils/FilterBuilder.py", "43", "13", "30.2 %" "gui/utils/ProxyAction.py", "67", "21", "31.3 %" "gui/utils/__init__.py", "34", "14", "41.2 %" "gui/utils/colorutils.py", "48", "43", "89.6 %" "gui/utils/eventutils.py", "70", "38", "54.3 %" "gui/utils/imageutils.py", "25", "13", "52.0 %" "gui/utils/projecturl.py", "20", "19", "95.0 %" "gui/utils/timeutils.py", "11", "9", "81.8 %" "gui/utils/tree.py", "11", "11", "100.0 %" "gui/utils/units.py", "76", "66", "86.8 %" "gui/utils/unitutils.py", "54", "8", "14.8 %" "gui/utils/validators.py", "89", "83", "93.3 %" "gui/utils/test/__init__.py", "9", "9", "100.0 %" "gui/widgets/AdvancedComboBox.py", "66", "56", "84.8 %" "gui/widgets/AdvancedSpinBox.py", "20", "11", "55.0 %" "gui/widgets/CalibrantPreview.py", "110", "100", "90.9 %" "gui/widgets/CalibrantSelector2.py", "211", "112", "53.1 %" "gui/widgets/CalibrantSelector.py", "100", "25", "25.0 %" "gui/widgets/ChoiceToolButton.py", "71", "43", "60.6 %" "gui/widgets/ColoredCheckBox.py", "28", "11", "39.3 %" "gui/widgets/DetectorLabel.py", "122", "74", "60.7 %" "gui/widgets/DetectorModel.py", "14", "12", "85.7 %" "gui/widgets/DetectorSelector.py", "55", "15", "27.3 %" "gui/widgets/FileEdit.py", "157", "60", "38.2 %" "gui/widgets/FitParamView.py", "340", "142", "41.8 %" "gui/widgets/GeometryHistoryComboBox.py", "113", "60", "53.1 %" "gui/widgets/GeometryLabel.py", "39", "31", "79.5 %" "gui/widgets/GeometryTabs.py", "205", "89", "43.4 %" "gui/widgets/LoadImageToolButton.py", "119", "50", "42.0 %" "gui/widgets/MethodLabel.py", "93", "49", "52.7 %" "gui/widgets/MonitorNameEdit.py", "20", "10", "50.0 %" "gui/widgets/OpenClDeviceLabel.py", "52", "22", "42.3 %" "gui/widgets/QuantityEdit.py", "151", "98", "64.9 %" "gui/widgets/QuantityLabel.py", "132", "80", "60.6 %" "gui/widgets/UnitLabel.py", "69", "37", "53.6 %" "gui/widgets/UnitSelector.py", "84", "81", "96.4 %" "gui/widgets/WorkerConfigurator.py", "626", "353", "56.4 %" "gui/widgets/__init__.py", "3", "3", "100.0 %" "gui/widgets/model/AllDetectorItemModel.py", "65", "62", "95.4 %" "gui/widgets/model/CalibrantFilterProxyModel.py", "32", "21", "65.6 %" "gui/widgets/model/CalibrantItemModel.py", "41", "35", "85.4 %" "gui/widgets/model/DetectorFilterProxyModel.py", "26", "25", "96.2 %" "gui/widgets/model/__init__.py", "3", "3", "100.0 %" "gui/widgets/test/TestQuantityEdit.py", "69", "67", "97.1 %" "gui/widgets/test/__init__.py", "12", "10", "83.3 %" "integrator/__init__.py", "9", "9", "100.0 %" "integrator/azimuthal.py", "1266", "979", "77.3 %" "integrator/common.py", "775", "369", "47.6 %" "integrator/fiber.py", "304", "240", "78.9 %" "integrator/load_engines.py", "165", "120", "72.7 %" "io/__init__.py", "684", "396", "57.9 %" "io/_json.py", "14", "11", "78.6 %" "io/calibrant_config.py", "169", "124", "73.4 %" "io/diffmap_config.py", "333", "273", "82.0 %" "io/image.py", "31", "26", "83.9 %" "io/integration_config.py", "553", "437", "79.0 %" "io/nexus.py", "458", "384", "83.8 %" "io/ponifile.py", "254", "207", "81.5 %" "io/sparse_frame.py", "154", "24", "15.6 %" "io/spots.py", "214", "139", "65.0 %" "io/tree.py", "76", "12", "15.8 %" "io/xrdml.py", "76", "75", "98.7 %" "opencl/OCLFullSplit.py", "193", "22", "11.4 %" "opencl/__init__.py", "48", "32", "66.7 %" "opencl/azim_csr.py", "707", "495", "70.0 %" "opencl/azim_hist.py", "475", "342", "72.0 %" "opencl/azim_lut.py", "333", "247", "74.2 %" "opencl/ocl_hist_pixelsplit.py", "222", "26", "11.7 %" "opencl/peak_finder.py", "478", "366", "76.6 %" "opencl/preproc.py", "234", "176", "75.2 %" "opencl/sort.py", "281", "216", "76.9 %" "opencl/test/__init__.py", "27", "27", "100.0 %" "resources/__init__.py", "40", "29", "72.5 %" "test/__init__.py", "32", "4", "12.5 %" "third_party/__init__.py", "0", "0", "0.0 %" "third_party/transformations.py", "7", "7", "100.0 %" "third_party/_local/__init__.py", "3", "3", "100.0 %" "third_party/_local/transformations.py", "712", "125", "17.6 %" "utils/__init__.py", "117", "65", "55.6 %" "utils/bayes.py", "101", "66", "65.3 %" "utils/callback.py", "13", "10", "76.9 %" "utils/dataclasses.py", "68", "57", "83.8 %" "utils/decorators.py", "106", "88", "83.0 %" "utils/ellipse.py", "81", "78", "96.3 %" "utils/grid.py", "92", "63", "68.5 %" "utils/header_utils.py", "73", "58", "79.5 %" "utils/logging_utils.py", "50", "47", "94.0 %" "utils/mask_utils.py", "74", "40", "54.1 %" "utils/mathutil.py", "501", "351", "70.1 %" "utils/multiprocessing.py", "17", "12", "70.6 %" "utils/orderedset.py", "54", "13", "24.1 %" "utils/shell.py", "54", "45", "83.3 %" "utils/stringutil.py", "100", "89", "89.0 %" "pyFAI total", "45671", "26689", "58.4 %"