Improvements before MAX IV test

This commit is contained in:
2024-04-25 20:11:58 +02:00
parent 2c8e1fd83d
commit ea70b27e85
80 changed files with 1835 additions and 1781 deletions
+38 -13
View File
@@ -3,6 +3,7 @@
#include "MXAnalyzer.h"
#include "CPUSpotFinder.h"
#include "../common/DiffractionGeometry.h"
#include "Regression.h"
double stddev(const std::vector<float> &v) {
if (v.size() <= 1)
@@ -45,6 +46,9 @@ void MXAnalyzer::ReadFromFPGA(const DeviceOutput *output, const SpotFindingSetti
void MXAnalyzer::ReadFromCPU(const int16_t *image, const SpotFindingSettings &settings, size_t module_number) {
if (!find_spots)
return;
if (experiment.GetPixelDepth() == 4)
throw JFJochException(JFJochExceptionCategory::InputParameterInvalid,
"CPU spot finder simulation doesn't support 32-bit images");
std::vector<float> d_map(RAW_MODULE_SIZE);
DeviceOutput output{};
@@ -82,25 +86,46 @@ bool MXAnalyzer::Process(DataMessage &message, const SpotFindingSettings& settin
if (!indexer_result.empty()) {
message.indexing_result = 1;
for (int i = 0; i < recip.size(); i++) {
auto predicted_pos = RecipToDector(experiment, indexer_result[0].predicted_spots[i]);
float x_diff = predicted_pos.first - spots_out[i].RawCoord().x;
float y_diff = predicted_pos.second - spots_out[i].RawCoord().y;
x_drift += x_diff;
y_drift += y_diff;
message.spots[i].indexed = (x_diff * x_diff + y_diff * y_diff < spot_distance_threshold);
}
CalculateBeamCenterAndDistance(spots_out,
indexer_result[0],
message);
indexer_result[0].l.Save(message.indexing_lattice);
message.indexing_unit_cell = indexer_result[0].l.GetUnitCell();
if (!recip.empty()) {
message.indexing_drift_x_pxl = x_drift / recip.size();
message.indexing_drift_y_pxl = y_drift / recip.size();
}
}
}
spots.clear();
return indexed;
}
void MXAnalyzer::CalculateBeamCenterAndDistance(const std::vector<DiffractionSpot> &spots,
const IndexingResult& result,
DataMessage &message) {
if (spots.empty())
return;
assert(result.predicted_spots.size() == spots.size());
std::vector<float> spot_x_position(spots.size());
std::vector<float> spot_y_position(spots.size());
std::vector<float> spot_x_Sd1_over_Sd3(spots.size());
std::vector<float> spot_y_Sd2_over_Sd3(spots.size());
for (int i = 0; i < spots.size(); i++) {
spot_x_position[i] = spots[i].RawCoord().x * experiment.GetPixelSize_mm();
spot_y_position[i] = spots[i].RawCoord().y * experiment.GetPixelSize_mm();
Coord S = experiment.GetScatteringVector() + result.predicted_spots[i];
if (S.z != 0.0f) {
spot_x_Sd1_over_Sd3[i] = S.x / S.z;
spot_y_Sd2_over_Sd3[i] = S.y / S.z;
}
}
auto reg_x = regression(spot_x_Sd1_over_Sd3, spot_x_position);
auto reg_y = regression(spot_y_Sd2_over_Sd3, spot_y_position);
message.corr_beam_x_pxl = experiment.GetBeamX_pxl() - reg_x.intercept / experiment.GetPixelSize_mm();
message.corr_beam_y_pxl = experiment.GetBeamY_pxl() - reg_y.intercept / experiment.GetPixelSize_mm();
message.corr_det_dist_mm = experiment.GetDetectorDistance_mm() - (reg_x.slope + reg_y.slope) / 2.0;
}