// Copyright (2019-2024) Paul Scherrer Institute #include "IndexerWrapper.h" void IndexerWrapper::Setup(const UnitCell &cell) { #ifdef JFJOCH_USE_CUDA indexer.iCellM() = CrystalLattice(cell).GetEigenMatrix(); #endif } std::vector IndexerWrapper::Run(const std::vector &coord, float indexing_threshold) { #ifdef JFJOCH_USE_CUDA std::vector ret; if (coord.size() <= viable_cell_min_spots) return ret; assert(coord.size() <= MAX_SPOT_COUNT); for (int i = 0; i < coord.size(); i++) { indexer.spotX(i) = coord[i].x; indexer.spotY(i) = coord[i].y; indexer.spotZ(i) = coord[i].z; } // Index indexer.index(1, coord.size()); fast_feedback::refine::indexer_ifssr::refine(indexer.spotM().topRows(coord.size()), indexer.oCellM(), indexer.oScoreV(), cifssr); // Find cell most similar to the current one for (unsigned i=0u; i; M3x resid = indexer.spotM().topRows(coord.size()) * cell.transpose(); const M3x miller = round(resid.array()); const M3x predicted = miller * cell.transpose().inverse(); IndexingResult result; result.l = CrystalLattice(cell); result.predicted_spots.resize(coord.size()); for (int i = 0; i < coord.size(); i++) result.predicted_spots[i] = Coord(predicted.coeff(i, 0), predicted.coeff(i, 1), predicted.coeff(i, 2)); ret.emplace_back(result); } return ret; #else return {}; #endif }