144 double rotz,
const std::string &detname,
const std::string &inname,
145 const std::string &outname,
const std::string &peakOpt,
146 const std::string &rb_param,
const std::string &groupWSName) {
149 std::dynamic_pointer_cast<EventWorkspace>(AnalysisDataService::Instance().retrieve(inname));
154 g_log.
debug() << tim <<
" to movedetector()\n";
158 alg3->setPropertyValue(
"OutputWorkspace", outname);
159 alg3->setPropertyValue(
"Target",
"dSpacing");
160 alg3->executeAsChildAlg();
168 alg4->setPropertyValue(
"GroupingFileName",
"");
169 alg4->setPropertyValue(
"GroupingWorkspace", groupWSName);
170 alg4->executeAsChildAlg();
171 outputW = alg4->getProperty(
"OutputWorkspace");
174 g_log.
debug() << tim <<
" to DiffractionFocussing\n";
179 alg5->setPropertyValue(
"Params", rb_param);
180 alg5->executeAsChildAlg();
181 outputW = alg5->getProperty(
"OutputWorkspace");
186 const MantidVec &yValues = outputW->readY(0);
187 auto it = std::max_element(yValues.begin(), yValues.end());
188 double peakHeight = *it;
191 double peakLoc = outputW->readX(0)[it - yValues.begin()];
201 std::ostringstream fun_str;
202 fun_str <<
"name=Gaussian,Height=" << peakHeight <<
",Sigma=0.01,PeakCentre=" << peakLoc;
203 fit_alg->setProperty(
"Function", fun_str.str());
204 fit_alg->setProperty(
"InputWorkspace", outputW);
205 fit_alg->setProperty(
"WorkspaceIndex", 0);
206 fit_alg->setProperty(
"StartX", outputW->readX(0)[0]);
207 fit_alg->setProperty(
"EndX", outputW->readX(0)[outputW->blocksize()]);
208 fit_alg->setProperty(
"MaxIterations", 200);
209 fit_alg->setProperty(
"Output",
"fit");
210 fit_alg->executeAsChildAlg();
214 std::vector<double> params;
216 for (
size_t i = 0; i < fun_res->nParams(); ++i) {
217 params.emplace_back(fun_res->getParameter(i));
219 peakHeight = params[0];
224 g_log.
debug() << tim <<
" to movedetector()\n";
229 return (
static_cast<int>(inputE->getNumberEvents()) / 1.e6) / peakHeight +
230 std::fabs(peakLoc - boost::lexical_cast<double>(peakOpt));
273 const int maxIterations =
getProperty(
"MaxIterations");
274 const double peakOpt =
getProperty(
"LocationOfPeakToOptimize");
280 const std::string rb_params =
getProperty(
"Params");
285 const auto &dummyW = create<EventWorkspace>(*inputW, 1, inputW->binEdges(0));
289 std::vector<std::shared_ptr<RectangularDetector>> detList;
292 bool doOneBank = (!onebank.empty());
293 for (
int i = 0; i < inst->nelements(); i++) {
294 std::shared_ptr<RectangularDetector> det;
295 std::shared_ptr<ICompAssembly> assem;
296 std::shared_ptr<ICompAssembly> assem2;
298 det = std::dynamic_pointer_cast<RectangularDetector>((*inst)[i]);
300 if (det->getName() == onebank)
301 detList.emplace_back(det);
303 detList.emplace_back(det);
308 assem = std::dynamic_pointer_cast<ICompAssembly>((*inst)[i]);
310 for (
int j = 0; j < assem->nelements(); j++) {
311 det = std::dynamic_pointer_cast<RectangularDetector>((*assem)[j]);
313 if (det->getName() == onebank)
314 detList.emplace_back(det);
316 detList.emplace_back(det);
323 assem2 = std::dynamic_pointer_cast<ICompAssembly>((*assem)[j]);
325 for (
int k = 0; k < assem2->nelements(); k++) {
326 det = std::dynamic_pointer_cast<RectangularDetector>((*assem2)[k]);
328 if (det->getName() == onebank)
329 detList.emplace_back(det);
331 detList.emplace_back(det);
343 std::string inname =
getProperty(
"InputWorkspace");
344 std::string outname = inname +
"2";
347 algS->setProperty(
"InputWorkspace", inputW);
348 algS->setPropertyValue(
"SortBy",
"X Value");
349 algS->executeAsChildAlg();
352 std::string filename =
getProperty(
"DetCalFilename");
353 std::fstream outfile;
354 outfile.open(filename.c_str(), std::ios::out);
356 if (detList.size() > 1) {
358 outfile <<
"# Mantid Optimized .DetCal file for SNAP with TWO detector "
360 outfile <<
"# Old Panel, nominal size and distance at -90 degrees.\n";
361 outfile <<
"# New Panel, nominal size and distance at +90 degrees.\n";
363 outfile <<
"# Lengths are in centimeters.\n";
364 outfile <<
"# Base and up give directions of unit vectors for a local\n";
365 outfile <<
"# x,y coordinate system on the face of the detector.\n";
367 outfile <<
"# " << DateAndTime::getCurrentTime().toFormattedString(
"%c") <<
"\n";
369 outfile <<
"6 L1 T0_SHIFT\n";
372 outfile <<
"7 " << source->getDistance(*sample) * 100 <<
" 0\n";
373 outfile <<
"4 DETNUM NROWS NCOLS WIDTH HEIGHT DEPTH DETD "
374 "CenterX CenterY CenterZ BaseX BaseY BaseZ "
378 Progress prog(
this, 0.0, 1.0, detList.size());
379 for (
int det = 0; det < static_cast<int>(detList.size()); det++) {
381 par[0] = detList[det]->getName();
384 std::ostringstream strpeakOpt;
385 strpeakOpt << peakOpt;
386 par[3] = strpeakOpt.str();
391 auto alg2 = AlgorithmFactory::Instance().create(
"CreateGroupingWorkspace", 1);
393 alg2->setProperty(
"InputWorkspace", inputW);
394 alg2->setPropertyValue(
"GroupNames", detList[det]->
getName());
395 std::string groupWSName =
"group_" + detList[det]->getName();
396 alg2->setPropertyValue(
"OutputWorkspace", groupWSName);
397 alg2->executeAsChildAlg();
398 par[5] = groupWSName;
399 std::cout << tim <<
" to CreateGroupingWorkspace\n";
401 const gsl_multimin_fminimizer_type *T = gsl_multimin_fminimizer_nmsimplex;
403 gsl_multimin_function minex_func;
412 x = gsl_vector_alloc(nopt);
413 gsl_vector_set(
x, 0, 0.0);
414 gsl_vector_set(
x, 1, 0.0);
415 gsl_vector_set(
x, 2, 0.0);
416 gsl_vector_set(
x, 3, 0.0);
417 gsl_vector_set(
x, 4, 0.0);
418 gsl_vector_set(
x, 5, 0.0);
421 ss = gsl_vector_alloc(nopt);
422 gsl_vector_set_all(ss, 0.1);
427 minex_func.params = ∥
429 gsl_multimin_fminimizer *s = gsl_multimin_fminimizer_alloc(T, nopt);
430 gsl_multimin_fminimizer_set(s, &minex_func,
x, ss);
434 status = gsl_multimin_fminimizer_iterate(s);
439 double size = gsl_multimin_fminimizer_size(s);
440 status = gsl_multimin_test_size(size, 1e-2);
442 }
while (status == GSL_CONTINUE && iter < maxIterations && s->fval != -0.000);
445 if (s->fval != -0.000)
446 movedetector(gsl_vector_get(s->x, 0), gsl_vector_get(s->x, 1), gsl_vector_get(s->x, 2), gsl_vector_get(s->x, 3),
447 gsl_vector_get(s->x, 4), gsl_vector_get(s->x, 5), par[0],
getProperty(
"InputWorkspace"));
449 gsl_vector_set(s->x, 0, 0.0);
450 gsl_vector_set(s->x, 1, 0.0);
451 gsl_vector_set(s->x, 2, 0.0);
452 gsl_vector_set(s->x, 3, 0.0);
453 gsl_vector_set(s->x, 4, 0.0);
454 gsl_vector_set(s->x, 5, 0.0);
457 std::string reportOfDiffractionEventCalibrateDetectors = gsl_strerror(status);
458 if (s->fval == -0.000)
459 reportOfDiffractionEventCalibrateDetectors =
"No events";
465 <<
"Iteration = " << iter <<
"\n"
466 <<
"Status = " << reportOfDiffractionEventCalibrateDetectors <<
"\n"
467 <<
"Minimize PeakLoc-" << peakOpt <<
" = " << s->fval <<
"\n";
469 g_log.
information() <<
"Move (X) = " << gsl_vector_get(s->x, 0) * 0.01 <<
" \n";
470 g_log.
information() <<
"Move (Y) = " << gsl_vector_get(s->x, 1) * 0.01 <<
" \n";
471 g_log.
information() <<
"Move (Z) = " << gsl_vector_get(s->x, 2) * 0.01 <<
" \n";
477 V3D(gsl_vector_get(s->x, 0) * 0.01, gsl_vector_get(s->x, 1) * 0.01, gsl_vector_get(s->x, 2) * 0.01);
478 Kernel::V3D Center = detList[det]->getPos() + CalCenter;
479 int pixmax = detList[det]->xpixels() - 1;
480 int pixmid = (detList[det]->ypixels() - 1) / 2;
482 detList[det]->getAtXY(pixmax, pixmid)->getBoundingBox(box);
483 double baseX = box.
xMax();
484 double baseY = box.
yMax();
485 double baseZ = box.
zMax();
487 pixmid = (detList[det]->xpixels() - 1) / 2;
488 pixmax = detList[det]->ypixels() - 1;
489 detList[det]->getAtXY(pixmid, pixmax)->getBoundingBox(box);
490 double upX = box.
xMax();
491 double upY = box.
yMax();
492 double upZ = box.
zMax();
501 double angle = gsl_vector_get(s->x, 3) *
deg2rad;
502 Base =
V3D(baseX, baseY * cos(angle) - baseZ * sin(angle), baseY * sin(angle) + baseZ * cos(angle));
506 Up =
V3D(upX, upY * cos(angle) - upZ * sin(angle), upY * sin(angle) + upZ * cos(angle));
511 angle = gsl_vector_get(s->x, 4) *
deg2rad;
512 Base =
V3D(baseZ * sin(angle) + baseX * cos(angle), baseY, baseZ * cos(angle) - baseX * sin(angle));
516 Up =
V3D(upZ * cos(angle) - upX * sin(angle), upY, upZ * sin(angle) + upX * cos(angle));
521 angle = gsl_vector_get(s->x, 5) *
deg2rad;
522 Base =
V3D(baseX * cos(angle) - baseY * sin(angle), baseX * sin(angle) + baseY * cos(angle), baseZ);
526 Up =
V3D(upX * cos(angle) - upY * sin(angle), upX * sin(angle) + upY * cos(angle), upZ);
531 outfile <<
"5 " << detList[det]->getName().substr(4) <<
" " << detList[det]->xpixels() <<
" "
532 << detList[det]->ypixels() <<
" " << 100.0 * detList[det]->xsize() <<
" " << 100.0 * detList[det]->ysize()
535 <<
" " << Center.
norm() <<
" ";
536 Center.
write(outfile);
546 gsl_multimin_fminimizer_free(s);
549 AnalysisDataService::Instance().remove(groupWSName);