132 g_log.
error(
"Each peaks workspace MUST have only one run");
133 throw std::invalid_argument(
"Each peaks workspace MUST have only one run");
138 bool Run1HasOrientedLattice =
true;
139 if (!PeaksRun1->sample().hasOrientedLattice()) {
141 Run1HasOrientedLattice =
false;
143 const std::string fft(
"FindUBUsingFFT");
145 findUB->initialize();
147 findUB->setProperty(
"MIND",
static_cast<double>(
getProperty(
"MIND")));
148 findUB->setProperty(
"MAXD",
static_cast<double>(
getProperty(
"MAXD")));
149 findUB->setProperty(
"Tolerance",
Tolerance);
151 findUB->executeAsChildAlg();
153 if (!PeaksRun1->sample().hasOrientedLattice()) {
154 g_log.
notice(std::string(
"Could not find UB for ") + std::string(PeaksRun1->getName()));
155 throw std::invalid_argument(std::string(
"Could not find UB for ") + std::string(PeaksRun1->getName()));
160 UB1 = PeaksRun1->sample().getOrientedLattice().getUB();
165 double avErrIndx, avErrAll;
168 if (N1 < .6 * PeaksRun1->getNumberPeaks()) {
169 g_log.
notice(std::string(
"UB did not index well for ") + std::string(PeaksRun1->getName()));
170 throw std::invalid_argument(std::string(
"UB did not index well for ") + std::string(PeaksRun1->getName()));
175 auto lat2 = std::make_unique<OrientedLattice>(PeaksRun1->sample().getOrientedLattice());
177 PeaksRun2->mutableSample().setOrientedLattice(std::move(lat2));
179 if (!Run1HasOrientedLattice)
180 PeaksRun1->mutableSample().setOrientedLattice(
nullptr);
185 for (
int i = 0; i < PeaksRun2->getNumberPeaks(); i++) {
186 PeaksRun2->getPeak(i).setGoniometerMatrix(Gon22);
189 int RunNum = PeaksRun2->getPeak(0).getRunNumber();
191 int Npeaks = PeaksRun2->getNumberPeaks();
194 std::array<double, 5> MinData = {{0., 0., 0., 0., 0.}};
198 API::FrameworkManager::Instance();
200 for (
auto &dir : directionList)
201 for (
int sgn = 1; sgn > -2; sgn -= 2) {
203 Quat Q(sgn * dphi, dir);
208 double dummyAvErrIndx, dummyAvErrAll;
209 IndexRaw(PeaksRun2, Rot * UB1, Nindexed, dummyAvErrIndx, dummyAvErrAll,
Tolerance);
211 if (Nindexed > MinData[0]) {
212 MinData[0] = Nindexed;
221 g_log.
debug() <<
"Best direction unOptimized is (" << (MinData[1] * MinData[2]) <<
"," << (MinData[1] * MinData[3])
222 <<
"," << (MinData[1] * MinData[4]) <<
")\n";
226 auto ws = createWorkspace<Workspace2D>(1, 3 * Npeaks, 3 * Npeaks);
230 for (
int i = 0; i < Npeaks; ++i) {
231 Xvals.emplace_back(i);
232 Xvals.emplace_back(i);
233 Xvals.emplace_back(i);
236 ws->setPoints(0, Xvals);
239 V3D dir(MinData[2], MinData[3], MinData[4]);
241 Quat Q(MinData[1] * dphi, dir);
247 MinData[2] = omchiphi[2];
248 MinData[3] = omchiphi[1];
249 MinData[4] = omchiphi[0];
251 std::string FunctionArgs =
"name=PeakHKLErrors, PeakWorkspaceName=" + PeaksRun2->getName() +
",OptRuns=" + RunNumStr +
252 ",phi" + RunNumStr +
"=" + boost::lexical_cast<std::string>(MinData[2]) +
",chi" +
253 RunNumStr +
"=" + boost::lexical_cast<std::string>(MinData[3]) +
",omega" + RunNumStr +
254 "=" + boost::lexical_cast<std::string>(MinData[4]);
256 std::string Constr = boost::lexical_cast<std::string>(MinData[2] - 5) +
"<phi" + RunNumStr +
"<" +
257 boost::lexical_cast<std::string>(MinData[2] + 5);
258 Constr +=
"," + boost::lexical_cast<std::string>(MinData[3] - 5) +
"<chi" + RunNumStr +
"<" +
259 boost::lexical_cast<std::string>(MinData[3] + 5) +
",";
261 Constr += boost::lexical_cast<std::string>(MinData[4] - 5) +
"<omega" + RunNumStr +
"<" +
262 boost::lexical_cast<std::string>(MinData[4] + 5);
264 std::string Ties =
"SampleXOffset=0.0,SampleYOffset=0.0,SampleZOffset=0.0,"
265 "GonRotx=0.0,GonRoty=0.0,GonRotz=0.0";
276 std::string outputName =
"out";
282 std::shared_ptr<API::ITableWorkspace> results =
Fit->
getProperty(
"OutputParameters");
286 MinData[2] = results->Double(6, 1);
287 MinData[3] = results->Double(7, 1);
288 MinData[4] = results->Double(8, 1);
290 g_log.
debug() <<
"Best direction Optimized is (" << (MinData[2]) <<
"," << (MinData[3]) <<
"," << (MinData[4])
303 double deg, ax1, ax2, ax3;
305 if (dphi * deg < 0) {
311 double phi2 =
static_cast<double>(
getProperty(
"Run1Phi")) + dphi;
312 double chi2 = acos(ax2) / M_PI * 180;
313 double omega2 = atan2(ax3, -ax1) / M_PI * 180;
315 g_log.
notice() <<
"============================ Results ============================\n";
316 g_log.
notice() <<
" phi,chi, and omega= (" << phi2 <<
"," << chi2 <<
"," << omega2 <<
")\n";
317 g_log.
notice() <<
" #indexed =" << Nindexed <<
'\n';
318 g_log.
notice() <<
" ==============================================\n";
332 for (
int i = 0; i < PeaksRun2->getNumberPeaks(); i++) {
333 PeaksRun2->getPeak(i).setGoniometerMatrix(Gon2a);
336 auto latt2 = std::make_unique<OrientedLattice>(PeaksRun2->mutableSample().getOrientedLattice());
339 latt2->setUB(Gon2a * Mk * UB1);
341 PeaksRun2->mutableSample().setOrientedLattice(std::move(latt2));