Skip to content

Commit a57ff27

Browse files
author
aglowacki
committed
Merge branch 'master' of github.com:aglowacki/XRF-Maps
2 parents 6a96ed5 + d268d60 commit a57ff27

6 files changed

Lines changed: 255 additions & 13 deletions

File tree

src/core/defines.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,7 @@ const std::string STR_SCAN_TYPE_POLAR_XANES = "POLAR_XANES";
214214
const std::string STR_SCAN_TYPE_2D_MAP = "XRF_MAPS";
215215
const std::string STR_SCAN_TYPE_XRF_SINGLE_MCA = "XRF_SINGLE_MCA";
216216
const std::string STR_SCAN_TYPE_2D_EMD = "XRF_2D_EMD";
217+
const std::string STR_SCAN_TYPE_TIME_BASED_2D_MAP = "TIME_BASED_XRF_MAPS";
217218

218219
const std::string STR_SR_CURRENT = "SR_Current";
219220
const std::string STR_US_IC = "US_IC";
@@ -226,6 +227,9 @@ const std::string STR_CFG_5 = "CFG_5";
226227

227228
const std::string STR_POLARITY_PATTERN = "POLARITY_PATTERN";
228229

230+
const std::string STR_SCALER_OVERRIDE = "SCALER_OVERRIDE";
231+
const std::string STR_TIME_NORM_SCALER_OVERRIDE = "TIME_NORMALIZED_SCALER_OVERRIDE";
232+
229233
const std::string STR_K_A_LINES = "K Alpha";
230234
const std::string STR_K_B_LINES = "K Beta";
231235
const std::string STR_L_LINES = "L Lines";
@@ -273,6 +277,7 @@ const std::string STR_OUTPUT_COUNTS = "Output_Counts";
273277

274278
const std::string STR_MAPS = "MAPS";
275279
const std::string STR_SCAN = "Scan";
280+
const std::string STR_INTERFEROMETER = "Interferometer";
276281
const std::string STR_SPECTRA = "Spectra";
277282
const std::string STR_LHCP_SPECTRA = "LHCP_Spectra";
278283
const std::string STR_RHCP_SPECTRA = "RHCP_Spectra";

src/data_struct/scaler_lookup.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,28 @@ void Scaler_Lookup::add_beamline_scaler(const std::string& beamline, const std::
113113

114114
// ----------------------------------------------------------------------------
115115

116+
void Scaler_Lookup::add_override_beamline_scaler(const std::string& beamline, const std::string& scaler_label, const std::string& scaler_pv, bool is_time_normalized)
117+
{
118+
if (is_time_normalized)
119+
{
120+
for(auto itr: _beamline_map[beamline].time_normalized_scaler_pv_label_map)
121+
{
122+
_beamline_map[beamline].time_normalized_scaler_pv_label_map.erase(scaler_label);
123+
}
124+
_beamline_map[beamline].time_normalized_scaler_pv_label_map[scaler_pv] = scaler_label;
125+
}
126+
else
127+
{
128+
for(auto itr: _beamline_map[beamline].time_normalized_scaler_pv_label_map)
129+
{
130+
_beamline_map[beamline].scaler_pv_label_map.erase(scaler_label);
131+
}
132+
_beamline_map[beamline].scaler_pv_label_map[scaler_pv] = scaler_label;
133+
}
134+
}
135+
136+
// ----------------------------------------------------------------------------
137+
116138
void Scaler_Lookup::add_timing_info(const std::string& beamline, const std::string& time_pv, double clock)
117139
{
118140
_beamline_map[beamline].timing_info[time_pv] = clock;

src/data_struct/scaler_lookup.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,8 @@ class DLL_EXPORT Scaler_Lookup
8181

8282
void add_summed_scaler(const std::string& beamline, const std::string& scaler_label, const std::vector<std::string>& scaler_list);
8383

84+
void add_override_beamline_scaler(const std::string& beamline, const std::string& scaler_label, const std::string& scaler_pv, bool is_time_normalized);
85+
8486
bool search_for_timing_info(const std::vector<std::string>& pv_list, std::string& out_pv, double& out_clock, std::string& out_beamline);
8587

8688
bool search_for_timing_info(const std::unordered_map<std::string, double>& pv_map, std::string& out_pv, double& out_clock, std::string& out_beamline);

src/io/file/aps/aps_fit_params_import.h

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ POSSIBILITY OF SUCH DAMAGE.
5252
#include "core/defines.h"
5353
#include "data_struct/params_override.h"
5454
#include "data_struct/element_info.h"
55+
#include "data_struct/scaler_lookup.h"
5556
#include <string>
5657
#include <iostream>
5758
#include <fstream>
@@ -829,6 +830,36 @@ DLL_EXPORT bool load_parameters_override(std::string path, Params_Override<T_rea
829830
value.erase(std::remove(value.begin(), value.end(), ' '), value.end());
830831
params_override->polarity_pattern = value;
831832
}
833+
else if(tag == STR_SCALER_OVERRIDE)
834+
{
835+
std::string scaler_beamline;
836+
std::string scaler_name;
837+
std::string str_value;
838+
std::getline(strstream, scaler_beamline, ',');
839+
scaler_beamline.erase(std::remove_if(scaler_beamline.begin(), scaler_beamline.end(), ::isspace), scaler_beamline.end());
840+
std::getline(strstream, scaler_name, ',');
841+
scaler_name.erase(std::remove_if(scaler_name.begin(), scaler_name.end(), ::isspace), scaler_name.end());
842+
std::getline(strstream, str_value, ',');
843+
str_value.erase(std::remove(str_value.begin(), str_value.end(), '\n'), str_value.end());
844+
str_value.erase(std::remove(str_value.begin(), str_value.end(), '\r'), str_value.end());
845+
str_value.erase(std::remove(str_value.begin(), str_value.end(), ' '), str_value.end());
846+
data_struct::Scaler_Lookup::inst()->add_beamline_scaler(scaler_beamline, scaler_name, str_value, false);
847+
}
848+
else if(tag == STR_TIME_NORM_SCALER_OVERRIDE)
849+
{
850+
std::string scaler_beamline;
851+
std::string scaler_name;
852+
std::string str_value;
853+
std::getline(strstream, scaler_beamline, ',');
854+
scaler_beamline.erase(std::remove_if(scaler_beamline.begin(), scaler_beamline.end(), ::isspace), scaler_beamline.end());
855+
std::getline(strstream, scaler_name, ',');
856+
scaler_name.erase(std::remove_if(scaler_name.begin(), scaler_name.end(), ::isspace), scaler_name.end());
857+
std::getline(strstream, str_value, ',');
858+
str_value.erase(std::remove(str_value.begin(), str_value.end(), '\n'), str_value.end());
859+
str_value.erase(std::remove(str_value.begin(), str_value.end(), '\r'), str_value.end());
860+
str_value.erase(std::remove(str_value.begin(), str_value.end(), ' '), str_value.end());
861+
data_struct::Scaler_Lookup::inst()->add_beamline_scaler(scaler_beamline, scaler_name, str_value, true);
862+
}
832863

833864
}
834865
catch (std::exception& e)

src/io/file/hdf5_io.h

Lines changed: 175 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -913,13 +913,18 @@ class DLL_EXPORT HDF5_IO
913913
//-----------------------------------------------------------------------------
914914

915915
template<typename T_real>
916-
bool load_spectra_vol_apsu(std::string path, std::string filename, size_t detector_num, data_struct::Spectra_Volume<T_real>* spec_vol, [[maybe_unused]] data_struct::Scan_Info<T_real> &scan_info, [[maybe_unused]] bool logerr = true)
916+
bool load_spectra_vol_apsu(std::string path, std::string filename, size_t detector_num, data_struct::Spectra_Volume<T_real>* spec_vol, data_struct::ArrayXXr<T_real>* interferometer_avg, [[maybe_unused]] data_struct::Scan_Info<T_real> &scan_info, [[maybe_unused]] bool logerr = true)
917917
{
918918
std::stack<std::pair<hid_t, H5_OBJECTS> > close_map;
919919
hid_t file_id = -1, xspres_grp_id = -1;
920920
hid_t ss_grp_id = -1, tetra_grp_id = -1;
921+
hid_t ss_id = -1;
921922
bool load_ss = true;
922923
bool load_tetra = true;
924+
bool interferometer_loaded = false;
925+
data_struct::ArrayXXr<T_real> interferometer_array;
926+
data_struct::Spectra_Volume<T_real> temp_vol;
927+
923928
{
924929
std::lock_guard<std::mutex> lock(_mutex);
925930
if (false == _open_h5_object(file_id, H5O_FILE, close_map, path+filename, -1))
@@ -969,8 +974,36 @@ class DLL_EXPORT HDF5_IO
969974
H5Literate2(ss_grp_id, H5_INDEX_NAME, H5_ITER_INC, NULL, h5_ext_file_info, &ss_ext_links);
970975
for(auto itr : ss_ext_links)
971976
{
972-
// load socketserver data
977+
// load only the first one socketserver data
978+
logI<<"Loading interferometer information from "<<itr.first<<"\n";
979+
if (_open_h5_object(ss_id, H5O_DATASET, close_map, "data/data", itr.second, false, false))
980+
{
981+
hid_t dataspace_id = H5Dget_space(ss_id);
982+
close_map.push({ dataspace_id, H5O_DATASPACE });
983+
int rank = H5Sget_simple_extent_ndims(dataspace_id);
984+
if (rank != 2)
985+
{
986+
_close_h5_objects(close_map);
987+
logE << "Unknown interferometer layout. Rank is not 2\n";
988+
return false;
989+
}
990+
hsize_t* dims_in = new hsize_t[rank];
991+
hsize_t offset[2] = {0,0};
992+
int status_n = H5Sget_simple_extent_dims(dataspace_id, &dims_in[0], nullptr);
993+
if (status_n < 0)
994+
{
995+
_close_h5_objects(close_map);
996+
logE << "Failed to get interferometer dims\n";
997+
return false;
998+
}
999+
1000+
interferometer_array.resize(dims_in[0], dims_in[1]);
1001+
H5Sselect_hyperslab(dataspace_id, H5S_SELECT_SET, offset, nullptr, dims_in, nullptr);
1002+
interferometer_loaded = _read_h5d<T_real>(ss_id, dataspace_id, dataspace_id, H5P_DEFAULT, interferometer_array.data());
1003+
}
1004+
break;
9731005
}
1006+
9741007
}
9751008
if(load_tetra)
9761009
{
@@ -980,18 +1013,121 @@ class DLL_EXPORT HDF5_IO
9801013
// load tetramm data
9811014
}
9821015
}
983-
spec_vol->resize_and_zero(ext_links.size(),1,4096);
1016+
temp_vol.resize_and_zero(ext_links.size(),1,4096);
9841017
int i = 0;
9851018
for(auto itr : ext_links)
9861019
{
9871020
//std::string search_name = base_name + "_" + std::to_string(i) + ".hdf5";
9881021
//logI<< "searching "<< search_name << "\n";
9891022
//logI<< "loading "<< fname << "\n";
990-
_load_spectra_line_xspress3(itr.second, detector_num, &(*spec_vol)[i]);
1023+
_load_spectra_line_xspress3(itr.second, detector_num, &temp_vol[i]);
9911024
H5Gclose(itr.second);
9921025
i++;
9931026
}
9941027
}
1028+
scan_info.meta_info.requested_rows = temp_vol.rows();
1029+
scan_info.meta_info.requested_cols = temp_vol.cols();
1030+
unsigned int total_spectra = 0;
1031+
for(size_t i=0; i<temp_vol.rows(); i++)
1032+
{
1033+
total_spectra += temp_vol[i].size();
1034+
}
1035+
spec_vol->resize_and_zero(1, total_spectra, temp_vol.samples_size());
1036+
interferometer_avg->resize(total_spectra, interferometer_array.cols());
1037+
size_t t = 0;
1038+
for(size_t r=0; r<temp_vol.rows(); r++)
1039+
{
1040+
for(size_t c=0; c<temp_vol[r].size(); c++)
1041+
{
1042+
(*spec_vol)[0][t] = temp_vol[r][c];
1043+
t++;
1044+
}
1045+
}
1046+
1047+
if(interferometer_array.rows() > 1 && interferometer_array.cols() > 2)
1048+
{
1049+
scan_info.meta_info.x_axis.resize(1);
1050+
scan_info.meta_info.x_axis[0] = -1;
1051+
scan_info.meta_info.y_axis.resize(1);
1052+
scan_info.meta_info.y_axis[0] = -1;
1053+
Eigen::Index start_idx = 0;
1054+
Eigen::Index end_idx = 0;
1055+
T_real cnt = 0.;
1056+
T_real last_cntr_val = interferometer_array(0,2);
1057+
Eigen::Index cur_row = 0;
1058+
size_t num_zeros = 0;
1059+
// start at 1 to check previous value is diff
1060+
for(Eigen::Index r=1; r<interferometer_array.rows(); r++)
1061+
{
1062+
num_zeros = 0;
1063+
for(Eigen::Index c=0; c<interferometer_array.cols(); c++)
1064+
{
1065+
// first check that more than 1 col isn't just 0's for startup
1066+
if( interferometer_array(r,c) == 0)
1067+
{
1068+
num_zeros++;
1069+
}
1070+
}
1071+
if(interferometer_array(r,2) != last_cntr_val)
1072+
{
1073+
if(num_zeros > 2)
1074+
{
1075+
continue;
1076+
}
1077+
1078+
1079+
if(cur_row >= interferometer_avg->rows())
1080+
{
1081+
logI<<"Break\n";
1082+
break;
1083+
}
1084+
else
1085+
{
1086+
end_idx = r;
1087+
// zero out the row
1088+
for(Eigen::Index c=0; c<interferometer_array.cols(); c++)
1089+
{
1090+
(*interferometer_avg)(cur_row, c) = 0.0;
1091+
}
1092+
1093+
cnt = 0.0;
1094+
for(Eigen::Index i=start_idx; i<end_idx; i++)
1095+
{
1096+
if(i == start_idx)
1097+
{
1098+
for(Eigen::Index c=0; c<interferometer_array.cols(); c++)
1099+
{
1100+
(*interferometer_avg)(cur_row, c) = interferometer_array(i, c);
1101+
}
1102+
cnt += 1.0;
1103+
}
1104+
// index 1 is counter, can be same value sometimes and we need to skip it then
1105+
else if(interferometer_array(i, 1) != interferometer_array(i-1, 1))
1106+
{
1107+
for(Eigen::Index c=0; c<interferometer_array.cols(); c++)
1108+
{
1109+
(*interferometer_avg)(cur_row, c) += interferometer_array(i, c);
1110+
}
1111+
cnt += 1.0;
1112+
}
1113+
}
1114+
//logI<<"Start "<<start_idx<<" , End "<<end_idx<<" , cnt "<<cnt<<" sum val "<<(*interferometer_avg)(cur_row, 3)<<" avg val "<<(*interferometer_avg)(cur_row, 3) /cnt<<"/n";
1115+
if(cnt > 1.0)
1116+
{
1117+
// avg
1118+
for(Eigen::Index c=0; c<interferometer_array.cols(); c++)
1119+
{
1120+
(*interferometer_avg)(cur_row, c) /= cnt;
1121+
}
1122+
cur_row ++;
1123+
}
1124+
start_idx = end_idx;
1125+
last_cntr_val = interferometer_array(start_idx,2);
1126+
}
1127+
}
1128+
}
1129+
}
1130+
scan_info.meta_info.scan_type = STR_SCAN_TYPE_TIME_BASED_2D_MAP;
9951131
/*
9961132
// load spectra link
9971133
err = H5Lget_name_by_idx(xspres_grp_id, ".", H5_INDEX_NAME, H5_ITER_NATIVE, 0, &xspress3_link[0], 2048, H5P_DEFAULT);
@@ -7050,7 +7186,7 @@ class DLL_EXPORT HDF5_IO
70507186
std::chrono::time_point<std::chrono::system_clock> start, end;
70517187
start = std::chrono::system_clock::now();
70527188

7053-
hid_t scan_grp_id, maps_grp_id;
7189+
hid_t scan_grp_id = -1, maps_grp_id = -1;
70547190

70557191
if (scan_info == nullptr)
70567192
{
@@ -7129,6 +7265,40 @@ class DLL_EXPORT HDF5_IO
71297265

71307266
//-----------------------------------------------------------------------------
71317267

7268+
template<typename T_real>
7269+
bool save_interferometers(data_struct::ArrayXXr<T_real>* interf_arr)
7270+
{
7271+
hid_t scan_grp_id = -1, maps_grp_id = -1, iterf_grp = -1;
7272+
hid_t dset_values_id = -1, dataspace_values_id = -1;
7273+
hsize_t count[2] = { 1,1 };
7274+
7275+
if(interf_arr == nullptr)
7276+
{
7277+
return false;
7278+
}
7279+
count[0] = interf_arr->rows();
7280+
count[1] = interf_arr->cols();
7281+
if (false == _open_or_create_group(STR_MAPS, _cur_file_id, maps_grp_id))
7282+
{
7283+
return false;
7284+
}
7285+
if (false == _open_or_create_group(STR_SCAN, maps_grp_id, scan_grp_id))
7286+
{
7287+
return false;
7288+
}
7289+
if (false == _open_or_create_group(STR_INTERFEROMETER, scan_grp_id, iterf_grp))
7290+
{
7291+
return false;
7292+
}
7293+
if (false == _open_h5_dataset<T_real>(STR_VALUES, iterf_grp, 2, count, count, dset_values_id, dataspace_values_id))
7294+
{
7295+
return false;
7296+
}
7297+
return _write_h5d<T_real>(dset_values_id, dataspace_values_id, dataspace_values_id, H5P_DEFAULT, interf_arr->data());
7298+
}
7299+
7300+
//-----------------------------------------------------------------------------
7301+
71327302
template<typename T_real>
71337303
bool save_scan_scalers_confocal(std::string path,
71347304
[[maybe_unused]] size_t row_idx_start=0,

0 commit comments

Comments
 (0)