73 g_log.
notice() <<
"Starting DgsConvertToEnergyTransfer\n";
75 const std::string reductionManagerName = this->
getProperty(
"ReductionProperties");
76 std::shared_ptr<PropertyManager> reductionManager;
77 if (PropertyManagerDataService::Instance().doesExist(reductionManagerName))
78 reductionManager = PropertyManagerDataService::Instance().retrieve(reductionManagerName);
80 throw std::runtime_error(
"DgsConvertToEnergyTransfer cannot run without a "
81 "reduction PropertyManager.");
88 std::string monWsName = inputWS->getName() +
"_monitors";
89 bool preserveEvents =
false;
92 const std::string facility = ConfigService::Instance().getFacility().name();
93 g_log.
notice() <<
"Processing for " << facility <<
'\n';
94 double eiGuess = this->
getProperty(
"IncidentEnergyGuess");
98 if (
"SNS" == facility) {
102 throw std::runtime_error(
"Incident energy guess MUST be given!");
105 const bool useEiGuess = reductionManager->getProperty(
"UseIncidentEnergyGuess");
106 const double tZeroGuess = reductionManager->getProperty(
"TimeZeroGuess");
107 std::vector<double> etBinning = reductionManager->getProperty(
"EnergyTransferRange");
110 if (etBinning.empty()) {
111 double emin = -0.5 * eiGuess;
112 double deltaE = 0.01 * eiGuess;
113 double emax = 0.99 * eiGuess;
114 etBinning.emplace_back(emin);
115 etBinning.emplace_back(deltaE);
116 etBinning.emplace_back(emax);
119 double incidentEnergy = 0.0;
120 double monPeak = 0.0;
121 specnum_t eiMon1Spec =
static_cast<specnum_t>(reductionManager->getProperty(
"Monitor1SpecId"));
122 specnum_t eiMon2Spec =
static_cast<specnum_t>(reductionManager->getProperty(
"Monitor2SpecId"));
124 if (
"SNS" == facility) {
126 preserveEvents =
true;
129 incidentEnergy = eiGuess;
134 g_log.
notice() <<
"Trying to determine file name\n";
135 std::string runFileName = inputWS->run().getProperty(
"Filename")->value();
136 if (runFileName.empty())
137 throw std::runtime_error(
"Cannot find run filename, therefore cannot "
138 "find the initial energy");
140 std::string loadAlgName;
141 std::string fileProp;
142 if (runFileName.ends_with(
"_event.nxs") || runFileName.ends_with(
".nxs.h5") || runFileName.ends_with(
".nxs")) {
144 loadAlgName =
"LoadNexusMonitors";
145 fileProp =
"Filename";
148 if (runFileName.ends_with(
"_neutron_event.dat")) {
150 loadAlgName =
"LoadPreNexusMonitors";
151 boost::replace_first(runFileName,
"_neutron_event.dat",
"_runinfo.xml");
152 fileProp =
"RunInfoFilename";
157 loadmon->setProperty(fileProp, runFileName);
158 loadmon->setProperty(
"OutputWorkspace", monWsName);
159 loadmon->executeAsChildAlg();
160 Workspace_sptr monWSOutput = loadmon->getProperty(
"OutputWorkspace");
163 monWS = std::dynamic_pointer_cast<MatrixWorkspace>(monWSOutput);
164 if ((monWSOutput) && (!monWS))
168 "implemented in DGSReduction yet");
173 getei->setProperty(
"InputWorkspace", monWS);
174 getei->setProperty(
"Monitor1Spec", eiMon1Spec);
175 getei->setProperty(
"Monitor2Spec", eiMon2Spec);
176 getei->setProperty(
"EnergyEstimate", eiGuess);
177 getei->executeAsChildAlg();
178 incidentEnergy = getei->getProperty(
"IncidentEnergy");
179 tZero = getei->getProperty(
"Tzero");
184 alg->setProperty(
"InputWorkspace", inputWS);
185 alg->setProperty(
"OutputWorkspace", outputWS);
186 alg->setProperty(
"Offset", -tZero);
187 alg->executeAsChildAlg();
188 outputWS = alg->getProperty(
"OutputWorkspace");
192 addLog->setProperty(
"Workspace", outputWS);
193 addLog->setProperty(
"LogName",
"CalculatedT0");
194 addLog->setProperty(
"LogType",
"Number");
195 addLog->setProperty(
"LogText", boost::lexical_cast<std::string>(tZero));
196 addLog->executeAsChildAlg();
201 getei->setProperty(
"InputWorkspace", inputWS);
202 getei->setProperty(
"Monitor1Spec", eiMon1Spec);
203 getei->setProperty(
"Monitor2Spec", eiMon2Spec);
204 getei->setProperty(
"EnergyEstimate", eiGuess);
205 getei->executeAsChildAlg();
207 monPeak = getei->getProperty(
"FirstMonitorPeak");
208 const specnum_t monIndex =
static_cast<specnum_t>(getei->getProperty(
"FirstMonitorIndex"));
210 incidentEnergy = getei->getProperty(
"IncidentEnergy");
213 cbo->setProperty(
"InputWorkspace", inputWS);
214 cbo->setProperty(
"OutputWorkspace", outputWS);
215 cbo->setProperty(
"Offset", -monPeak);
216 cbo->executeAsChildAlg();
217 outputWS = cbo->getProperty(
"OutputWorkspace");
219 const auto &specInfo = inputWS->spectrumInfo();
220 const V3D &monPos = specInfo.position(monIndex);
221 std::string srcName = inputWS->getInstrument()->getSource()->getName();
224 moveInstComp->setProperty(
"Workspace", outputWS);
225 moveInstComp->setProperty(
"ComponentName", srcName);
226 moveInstComp->setProperty(
"X", monPos.
X());
227 moveInstComp->setProperty(
"Y", monPos.
Y());
228 moveInstComp->setProperty(
"Z", monPos.
Z());
229 moveInstComp->setProperty(
"RelativePosition",
false);
230 moveInstComp->executeAsChildAlg();
233 const double binOffset = -monPeak;
235 if (
"ISIS" == facility) {
236 std::string detcalFile;
237 if (reductionManager->existsProperty(
"SampleDetCalFilename"))
238 detcalFile = reductionManager->getPropertyValue(
"SampleDetCalFilename");
241 detcalFile = inputWS->run().getProperty(
"Filename")->value();
242 if (!detcalFile.empty()) {
243 const bool relocateDets = reductionManager->getProperty(
"RelocateDetectors");
245 loaddetinfo->setProperty(
"Workspace", outputWS);
246 loaddetinfo->setProperty(
"DataFilename", detcalFile);
247 loaddetinfo->setProperty(
"RelocateDets", relocateDets);
248 loaddetinfo->executeAsChildAlg();
249 outputWS = loaddetinfo->getProperty(
"Workspace");
251 throw std::runtime_error(
"Cannot find detcal filename in run object or as parameter.");
256 const bool doTibSub = reductionManager->getProperty(
"TimeIndepBackgroundSub");
262 double tibTofStart =
getDblPropOrParam(
"TibTofRangeStart", reductionManager,
"bkgd-range-min", inputWS);
263 tibTofStart += binOffset;
264 double tibTofEnd =
getDblPropOrParam(
"TibTofRangeEnd", reductionManager,
"bkgd-range-max", inputWS);
265 tibTofEnd += binOffset;
266 const double tibTofWidth = tibTofEnd - tibTofStart;
267 std::vector<double> params{tibTofStart, tibTofWidth, tibTofEnd};
269 bool treatTibAsEvents =
false;
272 std::vector<std::string> backgroundType =
273 inputWS->getInstrument()->getStringParameter(
"treat-background-as-events");
274 if (backgroundType.empty()) {
276 treatTibAsEvents =
false;
278 if (
"yes" == backgroundType[0] ||
"true" == backgroundType[0]) {
279 treatTibAsEvents =
true;
283 if (
"SNS" == facility) {
287 if (treatTibAsEvents) {
291 createBkg->setProperty(
"InputWorkspace", outputWS);
292 createBkg->setProperty(
"RangeStart", tibTofStart);
293 createBkg->setProperty(
"RangeEnd", tibTofEnd);
294 createBkg->executeAsChildAlg();
295 bkgWS = createBkg->getProperty(
"OutputWorkspace");
300 std::string origBkgWsName =
"background_origin_ws";
302 rebin->setProperty(
"InputWorkspace", outputWS);
303 rebin->setProperty(
"OutputWorkspace", origBkgWsName);
304 rebin->setProperty(
"Params", params);
305 rebin->setProperty(
"PreserveEvents",
false);
306 rebin->setProperty(
"IgnoreBinErrors",
true);
307 rebin->executeAsChildAlg();
312 cnvun->setProperty(
"InputWorkspace", outputWS);
313 cnvun->setProperty(
"OutputWorkspace", outputWS);
314 cnvun->setProperty(
"Target",
"DeltaE");
315 cnvun->setProperty(
"EMode",
"Direct");
316 cnvun->setProperty(
"EFixed", incidentEnergy);
317 cnvun->executeAsChildAlg();
318 outputWS = cnvun->getProperty(
"OutputWorkspace");
321 rebin->setProperty(
"InputWorkspace", outputWS);
322 rebin->setProperty(
"OutputWorkspace", outputWS);
323 rebin->setProperty(
"Params", etBinning);
324 rebin->setProperty(
"PreserveEvents",
false);
325 rebin->executeAsChildAlg();
326 outputWS = rebin->getProperty(
"OutputWorkspace");
329 cnvun->setProperty(
"InputWorkspace", outputWS);
330 cnvun->setProperty(
"OutputWorkspace", outputWS);
331 cnvun->setProperty(
"Target",
"TOF");
332 cnvun->setProperty(
"EMode",
"Direct");
333 cnvun->setProperty(
"EFixed", incidentEnergy);
334 cnvun->executeAsChildAlg();
335 outputWS = cnvun->getProperty(
"OutputWorkspace");
338 cnvToDist->setProperty(
"Workspace", outputWS);
339 cnvToDist->executeAsChildAlg();
340 outputWS = cnvToDist->getProperty(
"Workspace");
344 flatBg->setProperty(
"InputWorkspace", origBkgWS);
345 flatBg->setProperty(
"StartX", tibTofStart);
346 flatBg->setProperty(
"EndX", tibTofEnd);
347 flatBg->setProperty(
"Mode",
"Mean");
348 flatBg->setProperty(
"OutputMode",
"Return Background");
349 flatBg->executeAsChildAlg();
350 bkgWS = flatBg->getProperty(
"OutputWorkspace");
356 cnvToDist->setProperty(
"Workspace", bkgWS);
357 cnvToDist->executeAsChildAlg();
358 bkgWS = cnvToDist->getProperty(
"Workspace");
363 minus->setProperty(
"LHSWorkspace", outputWS);
364 minus->setProperty(
"RHSWorkspace", bkgWS);
365 minus->setProperty(
"OutputWorkspace", outputWS);
366 minus->executeAsChildAlg();
373 cnvToDist->setProperty(
"Workspace", outputWS);
374 cnvToDist->executeAsChildAlg();
375 outputWS = cnvToDist->getProperty(
"Workspace");
378 flatBg->setProperty(
"InputWorkspace", outputWS);
379 flatBg->setProperty(
"OutputWorkspace", outputWS);
380 flatBg->setProperty(
"StartX", tibTofStart);
381 flatBg->setProperty(
"EndX", tibTofEnd);
382 flatBg->setProperty(
"Mode",
"Mean");
383 flatBg->executeAsChildAlg();
384 outputWS = flatBg->getProperty(
"OutputWorkspace");
387 if (!treatTibAsEvents) {
390 cnvFrDist->setProperty(
"Workspace", outputWS);
391 cnvFrDist->executeAsChildAlg();
392 outputWS = cnvFrDist->getProperty(
"Workspace");
398 norm->setProperty(
"InputWorkspace", outputWS);
399 norm->setProperty(
"OutputWorkspace", outputWS);
400 norm->setProperty(
"InputMonitorWorkspace", monWS);
401 norm->setProperty(
"TofRangeOffset", binOffset);
402 norm->executeAsChildAlg();
403 outputWS = norm->getProperty(
"OutputWorkspace");
406 g_log.
notice() <<
"Converting to energy transfer.\n";
408 cnvun->setProperty(
"InputWorkspace", outputWS);
409 cnvun->setProperty(
"OutputWorkspace", outputWS);
410 cnvun->setProperty(
"Target",
"DeltaE");
411 cnvun->setProperty(
"EMode",
"Direct");
412 cnvun->setProperty(
"EFixed", incidentEnergy);
413 cnvun->executeAsChildAlg();
414 outputWS = cnvun->getProperty(
"OutputWorkspace");
418 rebin->setProperty(
"InputWorkspace", outputWS);
419 rebin->setProperty(
"OutputWorkspace", outputWS);
420 rebin->setProperty(
"Params", etBinning);
421 rebin->setProperty(
"IgnoreBinErrors",
true);
422 rebin->setProperty(
"PreserveEvents", preserveEvents);
423 rebin->executeAsChildAlg();
424 outputWS = rebin->getProperty(
"OutputWorkspace");
427 if (
"SNS" == facility) {
429 cnvun->setProperty(
"InputWorkspace", outputWS);
430 cnvun->setProperty(
"OutputWorkspace", outputWS);
431 cnvun->setProperty(
"Target",
"Wavelength");
432 cnvun->executeAsChildAlg();
433 outputWS = cnvun->getProperty(
"OutputWorkspace");
437 alg2->setProperty(
"InputWorkspace", outputWS);
438 alg2->setProperty(
"OutputWorkspace", outputWS);
439 alg2->executeAsChildAlg();
440 outputWS = alg2->getProperty(
"OutputWorkspace");
443 cnvun->setProperty(
"InputWorkspace", outputWS);
444 cnvun->setProperty(
"OutputWorkspace", outputWS);
445 cnvun->setProperty(
"Target",
"DeltaE");
446 cnvun->executeAsChildAlg();
447 outputWS = cnvun->getProperty(
"OutputWorkspace");
452 alg->setProperty(
"InputWorkspace", outputWS);
453 alg->setProperty(
"OutputWorkspace", outputWS);
454 alg->executeAsChildAlg();
455 outputWS = alg->getProperty(
"OutputWorkspace");
458 const bool correctKiKf = reductionManager->getProperty(
"CorrectKiKf");
462 kikf->setProperty(
"InputWorkspace", outputWS);
463 kikf->setProperty(
"OutputWorkspace", outputWS);
464 kikf->setProperty(
"EMode",
"Direct");
465 kikf->executeAsChildAlg();
466 outputWS = kikf->getProperty(
"OutputWorkspace");
470 const bool sofphieIsDistribution = reductionManager->getProperty(
"SofPhiEIsDistribution");
473 rebin->setProperty(
"InputWorkspace", outputWS);
474 rebin->setProperty(
"OutputWorkspace", outputWS);
475 rebin->setProperty(
"IgnoreBinErrors",
true);
476 if (sofphieIsDistribution)
477 rebin->setProperty(
"PreserveEvents",
false);
478 rebin->executeAsChildAlg();
479 outputWS = rebin->getProperty(
"OutputWorkspace");
481 if (sofphieIsDistribution) {
484 distrib->setProperty(
"Workspace", outputWS);
485 distrib->executeAsChildAlg();
486 outputWS = distrib->getProperty(
"Workspace");
490 crop->setProperty(
"InputWorkspace", outputWS);
491 crop->setProperty(
"OutputWorkspace", outputWS);
492 crop->setProperty(
"XMin", etBinning[0]);
493 crop->setProperty(
"XMax", etBinning[2]);
494 crop->executeAsChildAlg();
495 outputWS = crop->getProperty(
"OutputWorkspace");
502 divide->setProperty(
"LHSWorkspace", outputWS);
503 divide->setProperty(
"RHSWorkspace", detVanWS);
504 divide->setProperty(
"OutputWorkspace", outputWS);
505 divide->executeAsChildAlg();
506 outputWS = divide->getProperty(
"OutputWorkspace");
512 std::string oldGroupFile;
513 std::string filePropMod = this->
getProperty(
"AlternateGroupingTag");
514 std::string fileProp = filePropMod +
"OldGroupingFilename";
515 if (reductionManager->existsProperty(fileProp))
516 oldGroupFile = reductionManager->getPropertyValue(fileProp);
518 remap->setProperty(
"InputWorkspace", outputWS);
519 remap->setProperty(
"OutputWorkspace", outputWS);
520 remap->setProperty(
"MaskWorkspace", maskWS);
521 remap->setProperty(
"GroupingWorkspace", groupWS);
522 remap->setProperty(
"OldGroupingFile", oldGroupFile);
523 remap->executeAsChildAlg();
524 outputWS = remap->getProperty(
"OutputWorkspace");
526 if (
"ISIS" == facility) {
527 double scaleFactor = inputWS->getInstrument()->getNumberParameter(
"scale-factor")[0];
529 scaleAlg->setProperty(
"InputWorkspace", outputWS);
530 scaleAlg->setProperty(
"Factor", scaleFactor);
531 scaleAlg->setProperty(
"Operation",
"Multiply");
532 scaleAlg->setProperty(
"OutputWorkspace", outputWS);
533 scaleAlg->executeAsChildAlg();