Per-Cube Histogram ------------------ .. uml:: skinparam style strictuml hide footbox title Per-Cube Histogram workflow actor User box "Client-side" #EDEDED participant Frontend end box box "Server-side" #lightblue participant Backend end box User -> Frontend: Open image activate Frontend Frontend -> Backend : 1. OPEN_FILE activate Backend Frontend <-- Backend : 2. OPEN_FILE_ACK Frontend -> Backend : 3. ADD_REQUIRED_TILES Frontend -> Backend : 4. SET_CURSOR Frontend <-- Backend : 5. REGION_HISTOGRAM_DATA Frontend <-- Backend : 5. SPATIAL_PROFILE_DATA Frontend <-- Backend : 5. RASTER_TILE_DATA deactivate Backend User <-- Frontend: Displays image deactivate Frontend User -> Frontend: Request per-cube histogram activate Frontend Frontend -> Backend : 6. SET_HISTOGRAM_REQUIREMENTS (channel=-2) activate Backend loop Progress updates Frontend <--[#red] Backend : 7. REGION_HISTOGRAM_DATA (progress < 1) [Check 1] end Frontend <--[#red] Backend : 8. REGION_HISTOGRAM_DATA (progress=1) [Check 2] deactivate Backend User <-- Frontend: Displays per-cube histogram deactivate Frontend PER_CUBE_HISTOGRAM ~~~~~~~~~~~~~~~~~~ See the `source code `__. This test verifies per-cube histogram calculation on a 3D FITS image cube. 1. Frontend sends: **OPEN_FILE** (``OpenFile``) .. code-block:: protobuf directory = "set_QA" file = "supermosaic.10.fits" hdu = "0" file_id = 0 render_mode = RASTER 2. Backend returns: **OPEN_FILE_ACK** (``OpenFileAck``) and **REGION_HISTOGRAM_DATA** 3. Frontend sends: **ADD_REQUIRED_TILES** and **SET_CURSOR** at (1, 1) 4. Frontend sends: **SET_HISTOGRAM_REQUIREMENTS** (``SetHistogramRequirements``) .. code-block:: protobuf file_id = 0 region_id = -2 histograms = [{channel: -2, num_bins: -1}] 5. Backend streams: **REGION_HISTOGRAM_DATA** with progress updates :red-text:`Check 1:` at progress > 0.5, the REGION_HISTOGRAM_DATA should satisfy: - binWidth = 0.7235205769538879 (4 decimal precision) - bins.length = 2775 - firstBinCenter = -1773.2998046875 - channel = -2, regionId = -2 :red-text:`Check 2:` at progress = 1.0 (complete), the REGION_HISTOGRAM_DATA should satisfy: - bins[2500] = 9359604 - mean = 18.742310255027036 - stdDev = 22.534721826342878 - numBins = 2775 PER_CUBE_HISTOGRAM_HDF5 ~~~~~~~~~~~~~~~~~~~~~~~~ See the `source code `__. This test verifies per-cube histogram calculation on an HDF5 image cube with the same data as the FITS test. 1. Frontend sends: **OPEN_FILE** (``OpenFile``) .. code-block:: protobuf directory = "set_QA" file = "supermosaic.10.hdf5" hdu = "0" file_id = 0 render_mode = RASTER 2-4. Same cursor, tiles, and histogram requirements as PER_CUBE_HISTOGRAM :red-text:`Check 1:` at progress = 1.0 (complete), the REGION_HISTOGRAM_DATA should satisfy: - binWidth = 0.7235205573004645 (4 decimal precision) - bins.length = 2775 - bins[2500] = 9359604 - firstBinCenter = -1773.2998608150997 - numBins = 2775 - mean = 18.742310241547514 (4 decimal precision) - stdDev = 22.534722680160574 (4 decimal precision) - regionId = -2, channel = -2 PER_CUBE_HISTOGRAM_CANCELLATION ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ See the `source code `__. This test verifies histogram computation cancellation and resumption behavior. 1. Frontend sends: **OPEN_FILE** (``OpenFile``) .. code-block:: protobuf directory = "set_QA" file = "SDC335.579-0.292.spw0-channel-cutted.line.fits" hdu = "0" file_id = 0 render_mode = RASTER 2. Frontend sends: **SET_HISTOGRAM_REQUIREMENTS** (``SetHistogramRequirements``) .. code-block:: protobuf file_id = 0 region_id = -2 histograms = [{channel: -2, num_bins: -1}] 3. Backend streams: **REGION_HISTOGRAM_DATA** with progress > 0 4. After 5 seconds, Frontend cancels by sending: **SET_HISTOGRAM_REQUIREMENTS** with empty histograms .. code-block:: protobuf file_id = 0 region_id = -2 histograms = [] 5. Backend returns: **ERROR_DATA** (2 error messages) :red-text:`Check 1:` the cancellation should satisfy: - Initial progress > 0 (computation started) - ERROR_DATA received after cancellation 6. After 2-second wait, Frontend retries: **SET_HISTOGRAM_REQUIREMENTS** with original parameters :red-text:`Check 2:` the resumed computation should satisfy: - Final progress = 1.0 - binWidth = 0.0007966686389409006 - bins.length = 342 - bins[170] = 10548 - firstBinCenter = -0.09137402474880219 - numBins = 342 - mean = 0.00005560920907762894 - stdDev = 0.012523454128847715