@@ -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