bool FindUBUsingIndexedPeaks::isPeakIndexed(Peak &peak) { V3D hkl(peak.getIntHKL()); // ##### KEEP V3D mnp(peak.getIntMNP()); return (IndexingUtils::ValidIndex(hkl, 1.0) || IndexingUtils::ValidIndex(mnp, 1.0)); }
/** Execute the algorithm. */ void FindUBUsingIndexedPeaks::exec() { PeaksWorkspace_sptr ws; ws = boost::dynamic_pointer_cast<PeaksWorkspace>( AnalysisDataService::Instance().retrieve(this->getProperty("PeaksWorkspace")) ); if (!ws) { throw std::runtime_error("Could not read the peaks workspace"); } std::vector<Peak> peaks = ws->getPeaks(); size_t n_peaks = ws->getNumberPeaks(); std::vector<V3D> q_vectors; std::vector<V3D> hkl_vectors; q_vectors.reserve( n_peaks ); hkl_vectors.reserve( n_peaks ); size_t indexed_count = 0; for ( size_t i = 0; i < n_peaks; i++ ) { V3D hkl( peaks[i].getH(), peaks[i].getK(), peaks[i].getL() ); // ##### KEEP if ( IndexingUtils::ValidIndex( hkl, 1.0 ) ) // use tolerance == 1 to // just check for (0,0,0) { q_vectors.push_back( peaks[i].getQSampleFrame() ); V3D miller_ind( round(hkl[0]), round(hkl[1]), round(hkl[2]) ); hkl_vectors.push_back( V3D(miller_ind) ); indexed_count++; } } if ( indexed_count < 3 ) { throw std::runtime_error( "At least three linearly independent indexed peaks are needed."); } Matrix<double> UB(3,3,false); double error = IndexingUtils::Optimize_UB( UB, hkl_vectors, q_vectors ); std::cout << "Error = " << error << std::endl; std::cout << "UB = " << UB << std::endl; if ( ! IndexingUtils::CheckUB( UB ) ) // UB not found correctly { g_log.notice( std::string( "Found Invalid UB...peaks used might not be linearly independent") ); g_log.notice( std::string( "UB NOT SAVED.") ); } else // tell user how many would be indexed { // from the full list of peaks, and q_vectors.clear(); // save the UB in the sample q_vectors.reserve( n_peaks ); for ( size_t i = 0; i < n_peaks; i++ ) { q_vectors.push_back( peaks[i].getQSampleFrame() ); } double tolerance = 0.1; int num_indexed = IndexingUtils::NumberIndexed(UB, q_vectors, tolerance); char logInfo[200]; sprintf( logInfo, std::string("New UB will index %1d Peaks out of %1d with tolerance %5.3f").c_str(), num_indexed, n_peaks, tolerance); g_log.notice( std::string(logInfo) ); OrientedLattice o_lattice; o_lattice.setUB( UB ); double calc_a = o_lattice.a(); double calc_b = o_lattice.b(); double calc_c = o_lattice.c(); double calc_alpha = o_lattice.alpha(); double calc_beta = o_lattice.beta(); double calc_gamma = o_lattice.gamma(); // Show the modified lattice parameters sprintf( logInfo, std::string("Lattice Parameters: %8.3f %8.3f %8.3f %8.3f %8.3f %8.3f").c_str(), calc_a, calc_b, calc_c, calc_alpha, calc_beta, calc_gamma); g_log.notice( std::string(logInfo) ); ws->mutableSample().setOrientedLattice( new OrientedLattice(o_lattice) ); } }