Test coverage report for pyFAI ============================== Measured on *pyFAI* version 2026.9.0, 15/09/2026 .. csv-table:: Test suite coverage :header: "Name", "Stmts", "Exec", "Cover" :widths: 35, 8, 8, 8 "__init__.py", "40", "29", "72.5 %" "average.py", "500", "354", "70.8 %" "azimuthalIntegrator.py", "10", "10", "100.0 %" "blob_detection.py", "501", "191", "38.1 %" "calibrant.py", "20", "20", "100.0 %" "containers.py", "897", "799", "89.1 %" "control_points.py", "372", "214", "57.5 %" "diffmap.py", "589", "286", "48.6 %" "directories.py", "20", "15", "75.0 %" "distortion.py", "616", "390", "63.3 %" "geometryRefinement.py", "594", "336", "56.6 %" "goniometer.py", "597", "368", "61.6 %" "grid.py", "38", "15", "39.5 %" "load_integrators.py", "10", "10", "100.0 %" "massif.py", "243", "196", "80.7 %" "method_registry.py", "436", "391", "89.7 %" "multi_geometry.py", "358", "141", "39.4 %" "parallax.py", "278", "220", "79.1 %" "ring_extraction.py", "118", "110", "93.2 %" "spline.py", "424", "249", "58.7 %" "units.py", "473", "428", "90.5 %" "version.py", "66", "49", "74.2 %" "worker.py", "723", "382", "52.8 %" "app/__init__.py", "21", "16", "76.2 %" "app/average.py", "177", "35", "19.8 %" "app/benchmark.py", "64", "19", "29.7 %" "app/calib2.py", "403", "33", "8.2 %" "app/calib.py", "24", "15", "62.5 %" "app/check_calib.py", "31", "20", "64.5 %" "app/detector2nexus.py", "95", "21", "22.1 %" "app/diff_map.py", "38", "16", "42.1 %" "app/diff_tomo.py", "108", "24", "22.2 %" "app/drawmask.py", "108", "34", "31.5 %" "app/eiger_mask.py", "58", "23", "39.7 %" "app/integrate.py", "544", "394", "72.4 %" "app/mx_calibrate.py", "25", "15", "60.0 %" "app/peakfinder.py", "289", "54", "18.7 %" "app/pilx.py", "70", "17", "24.3 %" "app/recalib.py", "26", "15", "57.7 %" "app/saxs.py", "88", "26", "29.5 %" "app/sparsify.py", "284", "55", "19.4 %" "app/waxs.py", "99", "26", "26.3 %" "benchmark/__init__.py", "657", "91", "13.9 %" "crystallography/__init__.py", "11", "11", "100.0 %" "crystallography/calibrant.py", "364", "281", "77.2 %" "crystallography/calibrant_factory.py", "48", "39", "81.2 %" "crystallography/cell.py", "189", "181", "95.8 %" "crystallography/resolution.py", "52", "51", "98.1 %" "crystallography/space_groups.py", "2360", "2247", "95.2 %" "detectors/__init__.py", "23", "23", "100.0 %" "detectors/_adsc.py", "64", "64", "100.0 %" "detectors/_common.py", "1005", "768", "76.4 %" "detectors/_dectris.py", "388", "297", "76.5 %" "detectors/_esrf.py", "71", "67", "94.4 %" "detectors/_hexagonal.py", "73", "69", "94.5 %" "detectors/_imxpad.py", "354", "231", "65.3 %" "detectors/_non_flat.py", "144", "122", "84.7 %" "detectors/_others.py", "87", "83", "95.4 %" "detectors/_psi.py", "192", "109", "56.8 %" "detectors/_rayonix.py", "241", "218", "90.5 %" "detectors/_xspectrum.py", "60", "54", "90.0 %" "detectors/multi_module.py", "341", "248", "72.7 %" "detectors/orientation.py", "35", "35", "100.0 %" "detectors/sensors.py", "137", "129", "94.2 %" "engines/CSC_engine.py", "213", "138", "64.8 %" "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", "9", "9", "100.0 %" "geometry/core.py", "1410", "1141", "80.9 %" "geometry/crystfel.py", "159", "145", "91.2 %" "geometry/cxi.py", "0", "0", "0.0 %" "geometry/fit2d.py", "136", "121", "89.0 %" "geometry/imaged11.py", "139", "118", "84.9 %" "geometry/utils.py", "33", "32", "97.0 %" "gui/ApplicationContext.py", "107", "51", "47.7 %" "gui/CalibrationContext.py", "225", "126", "56.0 %" "gui/CalibrationWindow.py", "190", "167", "87.9 %" "gui/IntegrationDialog.py", "218", "52", "23.9 %" "gui/__init__.py", "3", "3", "100.0 %" "gui/cli_calibration.py", "1560", "108", "6.9 %" "gui/diffmap_widget.py", "487", "79", "16.2 %" "gui/matplotlib.py", "30", "24", "80.0 %" "gui/mpl_calib.py", "240", "40", "16.7 %" "gui/mpl_calib_qt.py", "47", "19", "40.4 %" "gui/peak_picker.py", "299", "108", "36.1 %" "gui/dialog/Detector3dDialog.py", "173", "36", "20.8 %" "gui/dialog/DetectorSelectorDialog.py", "534", "401", "75.1 %" "gui/dialog/GeometryDialog.py", "57", "16", "28.1 %" "gui/dialog/IntegrationMethodDialog.py", "216", "36", "16.7 %" "gui/dialog/MessageBox.py", "30", "9", "30.0 %" "gui/dialog/OpenClDeviceDialog.py", "114", "14", "12.3 %" "gui/dialog/__init__.py", "3", "3", "100.0 %" "gui/helper/MarkerManager.py", "206", "63", "30.6 %" "gui/helper/ProcessingWidget.py", "19", "6", "31.6 %" "gui/helper/RingCalibration.py", "324", "54", "16.7 %" "gui/helper/RingExtractor.py", "255", "38", "14.9 %" "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", "92", "25", "27.2 %" "gui/model/AbstractModel.py", "36", "30", "83.3 %" "gui/model/CalibrantModel.py", "18", "16", "88.9 %" "gui/model/CalibrationModel.py", "44", "42", "95.5 %" "gui/model/ConstraintModel.py", "59", "21", "35.6 %" "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", "129", "111", "86.0 %" "gui/model/FilenameModel.py", "21", "14", "66.7 %" "gui/model/Fit2dGeometryModel.py", "60", "32", "53.3 %" "gui/model/GeometryConstraintsModel.py", "84", "41", "48.8 %" "gui/model/GeometryHistoryModel.py", "44", "17", "38.6 %" "gui/model/GeometryModel.py", "84", "41", "48.8 %" "gui/model/ImageModel.py", "80", "43", "53.8 %" "gui/model/IntegrationSettingsModel.py", "24", "23", "95.8 %" "gui/model/ListModel.py", "129", "92", "71.3 %" "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", "84", "34", "40.5 %" "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", "307", "49", "16.0 %" "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", "45", "19", "42.2 %" "gui/pilx/widgets/ImagePlotWidget.py", "68", "28", "41.2 %" "gui/pilx/widgets/IntegratedPatternPlotWidget.py", "96", "29", "30.2 %" "gui/pilx/widgets/MapPlotContextMenu.py", "48", "20", "41.7 %" "gui/pilx/widgets/MapPlotWidget.py", "151", "37", "24.5 %" "gui/pilx/widgets/OpenAxisDatasetAction.py", "29", "15", "51.7 %" "gui/pilx/widgets/RoiModeAction.py", "24", "14", "58.3 %" "gui/pilx/widgets/RoiRangeWidget.py", "48", "18", "37.5 %" "gui/pilx/widgets/TitleWidget.py", "12", "9", "75.0 %" "gui/pilx/widgets/__init__.py", "0", "0", "0.0 %" "gui/tasks/AbstractCalibrationTask.py", "78", "67", "85.9 %" "gui/tasks/ExperimentTask.py", "399", "266", "66.7 %" "gui/tasks/GeometryTask.py", "843", "377", "44.7 %" "gui/tasks/IntegrationTask.py", "832", "300", "36.1 %" "gui/tasks/MaskTask.py", "220", "146", "66.4 %" "gui/tasks/PeakPickingTask.py", "1369", "590", "43.1 %" "gui/tasks/__init__.py", "3", "3", "100.0 %" "gui/test/__init__.py", "45", "30", "66.7 %" "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", "24", "12", "50.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", "50", "8", "16.0 %" "gui/utils/validators.py", "81", "75", "92.6 %" "gui/utils/test/__init__.py", "9", "9", "100.0 %" "gui/widgets/AdvancedComboBox.py", "64", "56", "87.5 %" "gui/widgets/AdvancedSpinBox.py", "20", "11", "55.0 %" "gui/widgets/CalibrantPreview.py", "110", "100", "90.9 %" "gui/widgets/CalibrantSelector2.py", "212", "112", "52.8 %" "gui/widgets/CalibrantSelector.py", "97", "23", "23.7 %" "gui/widgets/ChoiceToolButton.py", "70", "42", "60.0 %" "gui/widgets/ColoredCheckBox.py", "28", "11", "39.3 %" "gui/widgets/DetectorLabel.py", "117", "71", "60.7 %" "gui/widgets/DetectorModel.py", "14", "12", "85.7 %" "gui/widgets/DetectorSelector.py", "55", "15", "27.3 %" "gui/widgets/FileEdit.py", "152", "59", "38.8 %" "gui/widgets/FitParamView.py", "337", "139", "41.2 %" "gui/widgets/GeometryHistoryComboBox.py", "113", "60", "53.1 %" "gui/widgets/GeometryLabel.py", "38", "30", "78.9 %" "gui/widgets/GeometryTabs.py", "203", "89", "43.8 %" "gui/widgets/LoadImageToolButton.py", "116", "49", "42.2 %" "gui/widgets/MethodLabel.py", "94", "50", "53.2 %" "gui/widgets/MonitorNameEdit.py", "20", "10", "50.0 %" "gui/widgets/OpenClDeviceLabel.py", "52", "22", "42.3 %" "gui/widgets/QuantityEdit.py", "149", "97", "65.1 %" "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", "612", "345", "56.4 %" "gui/widgets/__init__.py", "3", "3", "100.0 %" "gui/widgets/model/AllDetectorItemModel.py", "64", "61", "95.3 %" "gui/widgets/model/CalibrantFilterProxyModel.py", "32", "21", "65.6 %" "gui/widgets/model/CalibrantItemModel.py", "40", "34", "85.0 %" "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", "1178", "914", "77.6 %" "integrator/common.py", "912", "483", "53.0 %" "integrator/fiber.py", "311", "242", "77.8 %" "integrator/load_engines.py", "165", "120", "72.7 %" "io/__init__.py", "688", "400", "58.1 %" "io/_json.py", "25", "16", "64.0 %" "io/calibrant_config.py", "171", "126", "73.7 %" "io/diffmap_config.py", "334", "274", "82.0 %" "io/image.py", "31", "26", "83.9 %" "io/integration_config.py", "558", "451", "80.8 %" "io/nexus.py", "557", "446", "80.1 %" "io/ponifile.py", "288", "244", "84.7 %" "io/sparse_frame.py", "153", "23", "15.0 %" "io/spots.py", "213", "138", "64.8 %" "io/tree.py", "74", "12", "16.2 %" "io/xrdml.py", "76", "75", "98.7 %" "opencl/OCLFullSplit.py", "194", "22", "11.3 %" "opencl/__init__.py", "47", "31", "66.0 %" "opencl/azim_csr.py", "711", "497", "69.9 %" "opencl/azim_hist.py", "475", "342", "72.0 %" "opencl/azim_lut.py", "334", "248", "74.3 %" "opencl/ocl_hist_pixelsplit.py", "222", "26", "11.7 %" "opencl/peak_finder.py", "479", "367", "76.6 %" "opencl/preproc.py", "233", "177", "76.0 %" "opencl/sort.py", "281", "216", "76.9 %" "opencl/test/__init__.py", "19", "19", "100.0 %" "resources/__init__.py", "30", "26", "86.7 %" "test/__init__.py", "32", "4", "12.5 %" "third_party/__init__.py", "0", "0", "0.0 %" "third_party/classproperties.py", "7", "7", "100.0 %" "third_party/transformations.py", "7", "7", "100.0 %" "third_party/_local/__init__.py", "3", "3", "100.0 %" "third_party/_local/classproperties.py", "14", "13", "92.9 %" "third_party/_local/transformations.py", "712", "125", "17.6 %" "utils/__init__.py", "116", "64", "55.2 %" "utils/bayes.py", "101", "66", "65.3 %" "utils/callback.py", "13", "10", "76.9 %" "utils/dataclasses.py", "65", "55", "84.6 %" "utils/decorators.py", "107", "89", "83.2 %" "utils/ellipse.py", "76", "73", "96.1 %" "utils/grid.py", "92", "63", "68.5 %" "utils/header_utils.py", "68", "55", "80.9 %" "utils/logging_utils.py", "50", "47", "94.0 %" "utils/mask_utils.py", "74", "40", "54.1 %" "utils/mathutil.py", "499", "350", "70.1 %" "utils/multiprocessing.py", "17", "12", "70.6 %" "utils/orderedset.py", "54", "13", "24.1 %" "utils/shell.py", "52", "43", "82.7 %" "utils/stringutil.py", "100", "89", "89.0 %" "pyFAI total", "46531", "27493", "59.1 %"