diff --git a/common/StatusVector.cpp b/common/StatusVector.cpp index b8765ca9..f5ddb3ab 100644 --- a/common/StatusVector.cpp +++ b/common/StatusVector.cpp @@ -4,9 +4,11 @@ #include "StatusVector.h" -void StatusVector::Clear() { +void StatusVector::Clear(size_t reserve) { std::unique_lock ul(m); content.clear(); + if (reserve > 0) + content.reserve(reserve); mean = NAN; count = 0; @@ -187,15 +189,19 @@ MultiLinePlot StatusVector::GetMaxPlot(int64_t bin_size, float x_start, float x_ return ret; } -void StatusMultiVector::Clear() { +void StatusMultiVector::Clear(size_t reserve) { std::unique_lock ul(m); + if (reserve > 0) + r = reserve; status.clear(); } void StatusMultiVector::AddElement(const std::string &s, uint32_t id, float val) { std::unique_lock ul(m); - if (!status.contains(s)) + if (!status.contains(s)) { status[s] = std::make_unique(); + status[s]->Clear(r); + } status[s]->AddElement(id, val); } diff --git a/common/StatusVector.h b/common/StatusVector.h index 2326223f..65ea4956 100644 --- a/common/StatusVector.h +++ b/common/StatusVector.h @@ -22,7 +22,7 @@ class StatusVector { size_t count = 0; double sum = 0; public: - void Clear(); + void Clear(size_t reserve = 0); void AddElement(uint32_t id, std::optional val); void AddElement(uint32_t id, float val); std::optional GetElement(uint32_t id) const; @@ -44,8 +44,9 @@ public: class StatusMultiVector { std::mutex m; std::map> status; + size_t r = 0; public: - void Clear(); + void Clear(size_t reserve = 0); void AddElement(const std::string& s, uint32_t id, float val); void AddElement(const std::string& s, uint32_t id, std::optional val); diff --git a/receiver/JFJochReceiverPlots.cpp b/receiver/JFJochReceiverPlots.cpp index aada4c8d..9581db1f 100644 --- a/receiver/JFJochReceiverPlots.cpp +++ b/receiver/JFJochReceiverPlots.cpp @@ -13,41 +13,46 @@ void JFJochReceiverPlots::Setup(const DiffractionExperiment &experiment, const A grid_scan = experiment.GetGridScan(); default_binning = experiment.GetDefaultPlotBinning(); + size_t r = experiment.GetImageNum(); // Reset all status vectors xfel_pulse_id.Clear(); + if (experiment.IsPulsedSource()) { + xfel_pulse_id.reserve(r); + xfel_event_code.reserve(r); + } xfel_event_code.Clear(); - bkg_estimate.Clear(); - spot_count.Clear(); - spot_count_low_res.Clear(); - spot_count_indexed.Clear(); - spot_count_ice.Clear(); + bkg_estimate.Clear(r); + spot_count.Clear(r); + spot_count_low_res.Clear(r); + spot_count_indexed.Clear(r); + spot_count_ice.Clear(r); - indexing_solution.Clear(); - indexing_unit_cell_angle.Clear(); - indexing_unit_cell_len.Clear(); - error_pixels.Clear(); - saturated_pixels.Clear(); - strong_pixels.Clear(); - receiver_delay.Clear(); - receiver_free_send_buf.Clear(); - image_collection_efficiency.Clear(); - roi_sum.Clear(); - roi_max_count.Clear(); - roi_pixels.Clear(); - roi_x.Clear(); - roi_y.Clear(); - roi_mean.Clear(); - packets_received.Clear(); - max_value.Clear(); - resolution_estimate.Clear(); - indexing_time.Clear(); - profile_radius.Clear(); - mosaicity_deg.Clear(); - b_factor.Clear(); - processing_time.Clear(); - beam_center_x.Clear(); - beam_center_y.Clear(); - pixel_sum.Clear(); + indexing_solution.Clear(r); + indexing_unit_cell_angle.Clear(r); + indexing_unit_cell_len.Clear(r); + error_pixels.Clear(r); + saturated_pixels.Clear(r); + strong_pixels.Clear(r); + receiver_delay.Clear(r); + receiver_free_send_buf.Clear(r); + image_collection_efficiency.Clear(r); + roi_sum.Clear(r); + roi_max_count.Clear(r); + roi_pixels.Clear(r); + roi_x.Clear(r); + roi_y.Clear(r); + roi_mean.Clear(r); + packets_received.Clear(r); + max_value.Clear(r); + resolution_estimate.Clear(r); + indexing_time.Clear(r); + profile_radius.Clear(r); + mosaicity_deg.Clear(r); + b_factor.Clear(r); + processing_time.Clear(r); + beam_center_x.Clear(r); + beam_center_y.Clear(r); + pixel_sum.Clear(r); } void JFJochReceiverPlots::Add(const DataMessage &msg, const AzimuthalIntegrationProfile &profile) {